package com.wuxiaoge.converter;

import cn.hutool.core.bean.BeanUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.convert.TypeDescriptor;
import org.springframework.core.convert.converter.GenericConverter;

import java.util.HashSet;
import java.util.Map;
import java.util.Set;

/**
 * @author lingkang
 * Created by 2023/8/12
 */
@Slf4j
public class EntityToVoGenericConverter implements GenericConverter {

    // 不必担心性能问题，底层使用了cache存储处理
    @Override
    public Set<ConvertiblePair> getConvertibleTypes() {
        Set<ConvertiblePair> convertiblePairs = new HashSet<>();
        // 其他转换类可以直接在此添加（这样写是定向）
        // convertiblePairs.add(new ConvertiblePair(FolderEntity.class, FolderVo.class));
        // 或者写成这样，这样会匹配所有对象进行转换（推荐）
        convertiblePairs.add(new ConvertiblePair(Object.class, Object.class));
        // 用于解析 JpaQueryFactory.TupleConverter.TupleBackedMap（这样写是定向）
        // select e.id as id,e.name as name,e.createTime from FolderEntity e
        convertiblePairs.add(new ConvertiblePair(Map.class, Object.class));
        return convertiblePairs;
    }


    @Override
    public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {
        // System.out.println(source);
        try {
            if(Boolean.class.equals(sourceType.getType())||Boolean.class.equals(targetType.getType())){
                return source;
            }
            // 直接创建结果对象
            Object instance = targetType.getType().getDeclaredConstructor().newInstance();
            // hutool-core中的bean复制：FolderEntity 复制属性到 FolderVo
            BeanUtil.copyProperties(source, instance);
            // 返回结果： FolderVo
            return instance;
        } catch (Exception e) {
            log.error("无法解析的映射！", e);
            throw new RuntimeException(e);
        }
    }
}

